require "objetoFixo.lua"
require "objetoMovel.lua"
require "jogador.lua"
require "constantes.lua"

function editor()
	tipo = 1
	
	digiteAltura = false
	digiteLargura = false
	digitePeso = false
	digiteTorque = false
	digiteTextura = false
	digiteTipo = false
	
	alturaBloco = 50
	larguraBloco = 50
	pesoBloco = 5
	torqueBloco = 2
	texturaBloco = 1
	tipoBloco = "fix"
	
	posicaoUltimoSelX = 0
	posicaoUltimoSelY = 0
	
	--cria o chao e o limite
	objetosFixos[1] = objetoFixo:new( "cha",LARGURA_MUNDO/2,ALTURA_MUNDO-ALTURA_CHAO/2,LARGURA_MUNDO,ALTURA_CHAO,2 )  --chao do cenario
	objetosFixos[2] = objetoFixo:new( "lim",0,ALTURA_MUNDO/2,10,ALTURA_MUNDO,2 )  --limite do cenario
	
	leitorLeveis()
end

function editorDraw()
	for i,v in ipairs(objetosFixos) do
		objetosFixos[i]:draw()
	end
	for i,v in ipairs(objetosMoveis) do
		objetosMoveis[i]:draw()
	end
	for i,v in ipairs(jogadores)do
		jogadores[i]:draw()
	end
	
	--teste
	love.graphics.setColor(255, 255, 255)
	if ( (not digiteTipo) and (not digiteLargura) and (not digiteAltura) and (not digitePeso) and (not digiteTorque) and (not digiteTextura) ) then
		love.graphics.print(MSG_INICIAL.."\n"..MSG_INICIAL2.."\n\nAtualmente inserindo "..tipo.."\nLargura do Bloco: "..larguraBloco.."\nAltura do Bloco: "..alturaBloco.."\nPeso do Bloco: "..pesoBloco.."\nTorque do Bloco: "..torqueBloco.."\nTextura do Bloco: "..texturaBloco.."\nTipo do Bloco: "..tipoBloco,50,70)
	elseif (digiteLargura) then
		love.graphics.print(MSG_AJUDA.."\nLargura do Bloco: "..larguraBloco,50,70)
	elseif (digiteAltura) then
		love.graphics.print(MSG_AJUDA.."\nAltura do Bloco: "..alturaBloco,50,70)
	elseif (digiteTextura) then
		love.graphics.print(MSG_AJUDA3.."\nTextura do Bloco: "..texturaBloco,50,70)
	elseif (digitePeso) then
		love.graphics.print(MSG_AJUDA1.."\nPeso do Bloco: "..pesoBloco,50,70)
	elseif (digiteTorque) then
		love.graphics.print(MSG_AJUDA2.."\nTorque do Bloco: "..torqueBloco,50,70)
	elseif (digiteTipo) then
		love.graphics.print(MSG_AJUDA4.."\nTipo do Bloco: "..tipoBloco,50,70)
	end

	love.graphics.print("Posicao X do ultimo bloco selecionado: "..posicaoUltimoSelX.."\nPosicao Y do ultimo bloco selecionado: "..posicaoUltimoSelY,50,400)
	love.graphics.print("Posicao X do mouse: "..love.mouse.getX().."\nPosicao Y do mouse: "..love.mouse.getY(),50,500)
	
end

function editorUpdate()
	for i,v in ipairs(objetosMoveis) do
		objetosMoveis[i]:update()
	end
	for i,v in ipairs(jogadores) do
		jogadores[i]:update()
	end

	-- Anda com a camera deixando o jogador sempre nos 40% centrais da tela
	posMouseX, posMouseY = love.mouse.getPosition()
	if love.keyboard.isDown("a") then
		posicaoCamera = posicaoCamera-4
	elseif love.keyboard.isDown("d") then
		posicaoCamera = posicaoCamera+4
	end
end

function love.mousepressed( x, y, button )
	--insere um objeto na posicao clicada caso nao colida com nenhum outro
	if ( (button == "l") and (not digiteTipo) and (not digiteLargura)  and (not digiteAltura) and (not digitePeso) and (not digiteTorque) and (not digiteTextura) ) then
		for i,v in ipairs(objetosFixos) do		
			if objetosFixos[i]:sobreposicao(x+posicaoCamera,y,larguraBloco,alturaBloco) then
				posicaoUltimoSelX = objetosFixos[i]:getBody():getX()
				posicaoUltimoSelY = objetosFixos[i]:getBody():getY()
				return
			end
		end
		for i,v in ipairs(objetosMoveis) do
			if objetosMoveis[i]:sobreposicao(x+posicaoCamera,y,larguraBloco,alturaBloco) then
				posicaoUltimoSelX = objetosFixos[i]:getBody():getX()
				posicaoUltimoSelY = objetosFixos[i]:getBody():getY()
				return
			end
		end
		for i,v in ipairs(jogadores)do
			if jogadores[i]:sobreposicao(x+posicaoCamera,y,larguraBloco,alturaBloco) then
				posicaoUltimoSelX = objetosFixos[i]:getBody():getX()
				posicaoUltimoSelY = objetosFixos[i]:getBody():getY()
				return
			end
		end
		if tipo == 1 then
			objetosFixos[table.getn(objetosFixos) + 1] = objetoFixo:new( tipoBloco,x+posicaoCamera,y,larguraBloco,alturaBloco,texturaBloco )
		elseif tipo == 2 then
			objetosMoveis[table.getn(objetosMoveis) + 1] = objetoMovel:new( tipoBloco,x+posicaoCamera,y,larguraBloco,alturaBloco,pesoBloco,torqueBloco,texturaBloco )
		elseif tipo == 3 then
			jogadores[table.getn(jogadores) + 1] = jogador:new("jog","up","down","left","right",x+posicaoCamera,y,24,24,10)
		end
	--verifica se o clique com o botao direito foi em cima de um objeto e em caso afirmativo o remove
	elseif ( button == "r" and (not digiteTipo) and (not digiteLargura) and (not digiteAltura) and (not digitePeso) and (not digiteTorque) and (not digiteTextura) ) then
		for i,v in ipairs(objetosFixos) do		
			if objetosFixos[i]:clique(x+posicaoCamera,y) then
				removeObjetoFixo( i )
			end
		end
		for i,v in ipairs(objetosMoveis) do
			if objetosMoveis[i]:clique(x+posicaoCamera,y) then
				removeObjetoMovel( i )
			end
		end
		for i,v in ipairs(jogadores)do
			if jogadores[i]:clique(x+posicaoCamera,y) then
				removeJogador( i )
			end
		end
	end
end

function removeObjetoFixo( u )
	objetosFixos[u]:destroi()	
	for i=u,table.getn(objetosFixos),1 do
		objetosFixos[i] = objetosFixos[i+1]
	end	
end

function removeObjetoMovel( u )
	objetosMoveis[u]:destroi()
	for i=u,table.getn(objetosMoveis),1 do
		objetosMoveis[i] = objetosMoveis[i+1]
	end
end

function removeJogador( u )
	jogadores[u]:destroi()
	for i=u,table.getn(jogadores),1 do
		jogadores[i] = jogadores[i+1]
	end
end

function love.keypressed( key, unicode )
	if ( (not digiteTipo) and (not digiteLargura)  and (not digiteAltura) and (not digitePeso) and (not digiteTorque) and (not digiteTextura) ) then
		if key == "escape" then
			file = love.filesystem.newFile(FILENAME)
			file:open('w')
			for i,v in ipairs(objetosFixos) do
				temp = i+2
				if temp > table.getn( objetosFixos ) then
					break
				end
				file:write("OF "..math.floor( objetosFixos[temp]:getBody():getX() ).." "..math.floor( objetosFixos[temp]:getBody():getY() ).." "..objetosFixos[temp]:getLargura().." "..objetosFixos[temp]:getAltura().." "..objetosFixos[temp]:getBody():getMass().." "..objetosFixos[temp]:getBody():getInertia().." "..objetosFixos[temp]:getTextura().." "..objetosFixos[temp]:getNome().." \n")
			end
			for i,v in ipairs(objetosMoveis) do			
				file:write("OM "..math.floor( objetosMoveis[i]:getBody():getX() ).." "..math.floor( objetosMoveis[i]:getBody():getY() ).." "..objetosMoveis[i]:getLargura().." "..objetosMoveis[i]:getAltura().." "..objetosMoveis[i]:getBody():getMass().." "..objetosMoveis[i]:getBody():getInertia().." "..objetosMoveis[i]:getTextura().." "..objetosMoveis[i]:getNome().." \n")
			end
			for i,v in ipairs(jogadores)do
				file:write("JO "..math.floor( jogadores[i]:getBody():getX() ).." "..math.floor( jogadores[i]:getBody():getY() ).." "..jogadores[i]:getLargura().." "..jogadores[i]:getAltura().." "..jogadores[i]:getBody():getMass().." "..jogadores[i]:getBody():getInertia().." "..jogadores[i]:getTextura().." "..jogadores[i]:getNome().." \n")
			end
			file:close()	
		elseif key == "1" then
			tipo = 1
			alturaBloco = 50
			larguraBloco = 50
			pesoBloco = 5
			torqueBloco = 2
			texturaBloco = 1
			tipoBloco = "fix"
		elseif key == "2" then
			tipo = 2
			alturaBloco = 50
			larguraBloco = 50
			pesoBloco = 5
			torqueBloco = 2
			texturaBloco = 1
			tipoBloco = "emp"
		elseif key == "3" then	
			tipo = 3
			alturaBloco = 50
			larguraBloco = 50
			pesoBloco = 5
			torqueBloco = 2
			texturaBloco = 1
			tipoBloco = "jog"
		elseif key == "q" then
			digiteAltura = true
		elseif key == "w" then
			digiteLargura = true
		elseif key == "e" then
			digitePeso = true
		elseif key == "r" then
			digiteTorque = true
		elseif key == "t" then
			digiteTextura = true
		elseif key == "y" then
			digiteTipo = true
		elseif love.keyboard.isDown("left") then
			love.mouse.setPosition(posMouseX-1 ,posMouseY)
		elseif love.keyboard.isDown("right") then
			love.mouse.setPosition(posMouseX+1 ,posMouseY)
		elseif love.keyboard.isDown("down") then
			love.mouse.setPosition(posMouseX ,posMouseY+1)
		elseif love.keyboard.isDown("up") then
			love.mouse.setPosition(posMouseX ,posMouseY-1)
		end
	else
		if digiteAltura then
			trataAltura(key)
		elseif digiteLargura then
			trataLargura(key)
		elseif digitePeso then
			trataPeso(key)
		elseif digiteTorque then
			trataTorque(key)
		elseif digiteTextura then
			trataTextura(key)
		elseif digiteTipo then
			trataTipo(key)
		end		
	end
	
end

function trataAltura(t)
	if isDigit(t) then
		alturaBloco = alturaBloco*10+t
	elseif t == "backspace" then
		alturaBloco = math.floor(alturaBloco/10)
	elseif t == "return" then
		if larguraBloco > 0 then
			digiteAltura = false
		end		
	end
	
end

function trataLargura(t)
	if isDigit(t) then
		larguraBloco = larguraBloco*10+t
	elseif t == "backspace" then
		larguraBloco = math.floor(larguraBloco/10)		
	elseif t == "return" then
		if larguraBloco > 0 then
			digiteLargura = false
		end
	end
end

function trataTextura(t)
	if isDigit(t) then
		texturaBloco = texturaBloco*10+t
	elseif t == "backspace" then
		texturaBloco = math.floor(texturaBloco/10)		
	elseif t == "return" then
		if texturaBloco > 0 then
			digiteTextura = false
		end
	end
end

function trataPeso(t)
	if isDigit(t) then
		pesoBloco = pesoBloco*10+t
	elseif t == "backspace" then
		pesoBloco = math.floor(pesoBloco/10)		
	elseif t == "return" then
		if pesoBloco > 0 then
			digitePeso = false
		end
	end
end

function trataTorque(t)
	if isDigit(t) then
		torqueBloco = torqueBloco*10+t
	elseif t == "backspace" then
		torqueBloco = math.floor(torqueBloco/10)		
	elseif t == "return" then
		if torqueBloco > 0 then
			digiteTorque = false
		end
	end
end

function trataTipo(t)
	
	if t == "backspace" then
		tipoBloco = string.sub(tipoBloco, 1, string.len(tipoBloco)-1)
	elseif t == "return" then
		if string.len(tipoBloco) == 3 then
			digiteTipo = false
		end
	elseif string.len(tipoBloco) < 3 then
		tipoBloco = tipoBloco..t
	end

	
end
